package com.dc.docs._888_面试.concurrent._1_volatile;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Description: 测试 Volatile关键词不保证原子性_解决方案_AtomicInteger
 * @author: gdc
 * @date: 2021/6/15
 * @version 1.0
 */
public class Volatile_4_Cas {

    /**
     * 被 volatile修饰, 同时使用 AtomicInteger，来保证原子性
     */
    private volatile AtomicInteger number = new AtomicInteger(0);

    /**
     * 累加操作
     */
    public void increase(){
        number.incrementAndGet();
    }

    public static void main(String[] args){
        Volatile_4_Cas volatileDemo = new Volatile_4_Cas();
        for (int i = 0; i < 20; i++) {
            new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    volatileDemo.increase();
                }
            }, "AAA").start();
        }

        // 默认有main线程和gc线程
        while (Thread.activeCount() > 2) {
            // 使当前线程由执行状态变为就绪状态，让出cpu时间，在下一个线程执行时候，此线程有可能被执行，也有可能没有被执行
            Thread.yield();
        }

        // 测试最终累加的结果：20 * 1000 = 20000
        System.out.println(Thread.currentThread().getName() + " finally number value:" + volatileDemo.number);
    }
}
